package com.lagoupeixun.partone.homework;

import java.util.Arrays;
import java.util.Scanner;

/*
* author ： 皮永飞
* 解题思路：
* 1.获取初始化数组的长度
* 2.初始化数组。
* 3.使用for循环对数组进行数据填充，（默认都是0）
* 3.1 根据每次输入一个数据就count++ 来判断是否大于等于数组的长度，如果大于就进行扩充
* 3.2 数组扩充：我这里是自己实现了一个数组的copy，当然有一些弊端；
*               也就是将原来的数据先for循环copy给新声明的临时数组变量 target，
*               当原来数组new 1.5倍length后再指向原来数组new时候声明的变量arr,
*               再将原来copy给临时变量数组的数据进行回填到 1.5倍的数组。这样就实现的数组长度的变长，
*               实际数组长度是不能够变长的 ，只是因为 数组名是一个栈类型的变量， 存储的是在堆中数组的内存地址。
* 4 进行判断 是否需要停止循环，跳出循环体。
*
* 5 打印数组信息
*
* */
public class AddLength {
    public static void main(String[] args) {

//        1 获取初始数组的长度
        System.out.println("请输入一个初始数组的长度：");
        Scanner scanner = new Scanner(System.in);
        int length = scanner.nextInt();

//        2 声明并初始化数组
        int[] arr = new int[length];

        int count = 0;   // 增长数组的标准
        String flag ="n";  // 跳出数组输入的标志

        outer:while (true) {

//            3无线循环数组，并输入数组。
            for (int i = 0; i < arr.length; i++) {
                    System.out.println("请输入第 " + (i + 1) + " 个元素的值");
                    int num = scanner.nextInt();
                    arr[i] = num;
                    count++;
//                3.1 当数组长度已经使用完成0.8倍时，进行长度延长 1.5倍

                if (count>= 0.8 *arr.length){
                    int[] target = new int[arr.length];   // 用来保存原来记录的数组

                    for (int j = 0; j < arr.length; j++) {
                        target[j] = arr[j];
                    }
//                  3.2 数组长度变长， 变量arr 指向新数组
                    arr = new int[length + (length >> 1)];

//                   3.3  将原来数组数据回填
                    for (int j = 0; j < target.length; j++) {
                        arr[j] = target[j];
                    }
//                  4 决定数组需要退出不 ，默认不退出  ，如果不需要 则继续循环输入。
                    System.out.println("请确定是否停止输入：y/n");
                    flag = scanner.next();
                    if (flag.equals("y")) {
                        System.out.println("当前的数组为：" + Arrays.toString(arr));
                        break outer;
                    }
                }


            }

        }
    }
}
